package com.web.kftsdk.entity;

import com.web.kftsdk.common.bean.MultiSelect;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.NotBlank;

import java.util.List;
import java.util.Map;

/**
 * <p>Title: SecmerchantReq</p>
 * <p>Description: 二级商户入驻请求参数</p>
 *
 * @author xukk
 * @version 1.0
 * @date 2018/6/13
 */
@Data
@EqualsAndHashCode(callSuper = false)
@MultiSelect(multi = {"corpCertInfo", "personCertInfo"}, classType = List.class)
public class SecmerchantReq extends BaseReq {
    /**
     * 参数名称:商户身份ID
     * 可否为空：否
     * 参数描述：签约快付通的唯一用户编号，由快付通生成。
     */
    @NotBlank(groups = {Add.class, Query.class,Update.class})
    private String merchantId;

    /**
     * 参数名称:二级商户名称
     * 可否为空：否
     * 参数描述：要求与营业执照上的名称一致
     */
    @NotBlank(groups = {Add.class,Update.class})
    private String secMerchantName;

    /**
     * 参数名称:简称
     * 可否为空：否
     * 参数描述：会显示在用户app订单信息中
     */
    @NotBlank(groups = Add.class)
    private String shortName;

    /**
     * 参数名称:省份编码
     * 可否为空：可空
     * 参数描述：注册地址区县编码，具体见第5.3.5章节。
     */
    private String province;

    /**
     * 参数名称:城市编码
     * 可否为空：可空
     * 参数描述：注册地址区县编码，具体见第5.3.5章节。
     */
    private String city;

    /**
     * 参数名称:区县编码
     * 可否为空：否
     * 参数描述：注册地址区县编码，具体见第5.3.5章节。
     */
    @NotBlank(groups = Add.class)
    private String district;

    /**
     * 参数名称:注册地址-街道
     * 可否为空：否
     * 参数描述：地址
     */
    @NotBlank(groups = Add.class)
    private String address;

    /**
     * 参数名称:法人姓名
     * 可否为空：否
     * 参数描述：如果是个人商户，填个人商户姓名
     */
    @NotBlank(groups = Add.class)
    private String legalName;

    /**
     * 参数名称:联系人名称
     * 可否为空：否 ""
     * 参数描述：
     */
    @NotBlank(groups = Add.class)
    private String contactName;

    /**
     * 参数名称:联系手机号
     * 可否为空：否
     * 参数描述：联系手机号
     */
    @NotBlank(groups = Add.class)
    private String contactPhone;

    /**
     * 参数名称:联系邮箱
     * 可否为空：否
     * 参数描述：联系邮箱
     */
    @NotBlank(groups = Add.class)
    private String contactEmail;

    /**
     * 参数名称:商户类型
     * 可否为空：否
     * 参数描述：商户类型：1：个人、2：企业、3：个体工商户、4：事业单位
     */
    @NotBlank(groups = {Add.class, Query.class})
    private String merchantProperty;

    /**
     * 参数名称:经营类目
     * 可否为空：否
     * 参数描述：经营类目，具体见第5.3.4章节。
     */
    @NotBlank(groups = Add.class)
    private String category;

    /**
     * 参数名称:业务场景说明
     * 可否为空：否
     * 参数描述：业务场景说明
     */
    @NotBlank(groups = Add.class)
    private String businessScene;

    /**
     * 参数名称:备注说明
     * 可否为空：可空
     * 参数描述：介绍商户营业内容等
     */
    private String remark;

    /**
     * 参数名称:证件扫描件路径
     * 可否为空：否
     * 参数描述：在SFTP目录下的地址，上传的证件扫描件必须与企业证件信息/个人证件信息一致
     */
    @NotBlank(groups = Add.class)
    private String certPath;

    /**
     * 参数名称:证件扫描件文件签名
     * 可否为空：否
     * 参数描述：上报文件签名，对上报文档计算MD5摘要,然后对摘要进行base64编码,再使用UTF-8编码转换成String
     */
    @NotBlank(groups = Add.class)
    private String certDigest;

    /**
     * 参数名称:企业证件信息
     * 可否为空：可空
     * 参数描述：List<CertInof>，List对应的json字符串，CertInof的定义详见下表。商户类型为企业、个体工商户时必填。
     */
    private List<CertInfo> corpCertInfo;

    /**
     * 参数名称:个人证件信息
     * 可否为空：可空
     * 参数描述：List<CertInof>，List对应的json字符串，CertInof的定义详见下表。商户类型为个人时必填。
     */
    private List<CertInfo> personCertInfo;

    /**
     * 参数名称:清算银行账号
     * 可否为空：可空
     * 参数描述：SettleBankAccount对应的json字符串,SettleBankAccount的定义详见下表。如果需要快付通进行清算，必填。
     */
    private SettleBankAccount settleBankAccount;
    /**
     * 参数名称:开通的产品及费率
     * 可否为空：可空
     * 参数描述：给二级商户开通的产品及费率。List<ProductFee>，List对应的json字符串，ProductFee的定义详见下表。如果需要快付通进行清算，必填；如果不需要快付通进行清算，此项可为空，表示给商户开通所有的产品。
     */
    private List<ProductFee> productFees;
    /**
     * 查询条件 用到 证件号码，
     * 企业、事业单位商户、个体户请传营业执照
     * 个人请传身份证号
     * 证件号码
     */
    @NotBlank(groups = {Query.class})
    private String certNo;

    @Override
    public Map toMap(String service) {
        Map<String,String> map=super.toMap(service);
        map.put("merchantId", merchantId);
        map.put("secMerchantName", secMerchantName);
        map.put("shortName", shortName);
        map.put("province", province);
        map.put("city", city);
        map.put("district", district);
        map.put("address", address);
        map.put("legalName", legalName);
        map.put("contactName", contactName);
        map.put("contactPhone", contactPhone);
        map.put("contactEmail", contactEmail);
        map.put("merchantProperty", merchantProperty);
        map.put("category", category);
        map.put("businessScene", businessScene);
        map.put("remark", remark);
        map.put("certPath", certPath);
        map.put("certDigest", certDigest);
        map.put("corpCertInfo", JSON.toJSONString(corpCertInfo));
        map.put("personCertInfo", JSON.toJSONString(personCertInfo));
        map.put("settleBankAccount", JSON.toJSONString(settleBankAccount));
        map.put("productFees", JSON.toJSONString(productFees));
        map.put("certNo",certNo);
        return map;

    }

}
